#include "LessonX.h"
#include <cstring>
#include <cmath>
#include <cstdio>
#include "CommonClass.h"
#include <Windows.h>
#include <mmsystem.h>
//#include <cmath>
#pragma comment(lib, "Winmm.lib")


CGameMain g_GameMain;

CGameMain::CGameMain()
{
    m_iGameState = 0;
    m_bInitialized = false; // 初始化标志设为false
    m_pStart = new CSprite("start");
    m_pMan = NULL;
    m_pEnd1 = new CSprite("end1"); // 初始化结束精灵
    m_pEnd2 = new CSprite("end2");
    m_fStartX = -50.0f; // 初始化起始位置
    m_fStartY = 30.0f;
     m_iScore = 0; // 初始化分数为0
    m_pScoreText = new CTextSprite("score");
}


CGameMain::~CGameMain()
{
    delete m_pStart;
    delete m_pEnd1; // 清理结束精灵
    delete m_pEnd2;

    for (auto it = m_vGameObjects.begin(); it != m_vGameObjects.end(); ++it) {
        delete *it;
    }
    m_vGameObjects.clear();
}
void CGameMain::GameMainLoop(float fDeltaTime)
{
    switch (GetGameState())
    {
    case 1: // 初始化游戏
        GameInit();
        SetGameState(2); // 设置为进行中
        break;

    case 2: // 游戏进行中
        GameRun(fDeltaTime);
        break;

     case 3: // 游戏失败状态
        break;

    case 0: // 游戏结束/等待开始
        break;

    default:
        break;
    }
}

void CGameMain::GameInit()
{
    static bool bInitialized = false;
    if (bInitialized) return;

    // 1. 隐藏开始界面
    if (m_pStart) {
        m_pStart->SetSpriteVisible(false);
    }

     if (!m_pScoreText) {
        m_pScoreText = new CTextSprite("score");
       // m_pScoreText =CloneSprite("score");
        m_pScoreText->SetTextValue(0); // 使用CTextSprite的SetTextValue方法
        m_pScoreText->SetSpriteVisible(true);
    }

    // 2. 初始化玩家角色
     if (!m_pMan) {
        m_pMan = new CMan("man");
        m_pMan->CloneSprite("man");
        m_pMan->Init();
        m_vGameObjects.push_back(m_pMan);
    }

    // 设置玩家起始位置
    if (m_pMan) {
        m_pMan->SetSpritePosition(m_fStartX, m_fStartY);
    }

    // 3. 加载其他游戏对象
    LoadGameObjects(false);

    // 4. 创建并隐藏结束精灵 - 不再使用FindSprite
    if (!m_pEnd1) {
        m_pEnd1 = new CSprite("end1");
        m_pEnd1->CloneSprite("end1_template");
        m_pEnd1->SetSpriteVisible(false);
    }

    if (!m_pEnd2) {
        m_pEnd2 = new CSprite("end2");
        m_pEnd2->CloneSprite("end2_template");
        m_pEnd2->SetSpriteVisible(false);
    }

    bInitialized = true;
}

void CGameMain::GameRun(float fDeltaTime)
{
    for (size_t i = 0; i < m_vGameObjects.size(); )
    {
        if (m_vGameObjects[i]->IsDead()) {
            DeleteObjectByName(m_vGameObjects[i]->GetName());
        }
        else {
            m_vGameObjects[i]->OnMove(fDeltaTime);
            i++;
        }
    }

    // 强制检测所有碰撞
    //CheckAllCollisions();
}
void CGameMain::AddScore(int points)
{
    m_iScore += points;
    printf("Score updated! New score: %d\n", m_iScore); // 调试输出

    if (m_pScoreText) {
        printf("Updating score text display\n"); // 调试输出
        m_pScoreText->SetTextValue(m_iScore);
    } else {
        printf("ERROR: Score text object is null!\n"); // 调试输出
    }
}

void CGameMain::GameEnd()
{
    // 游戏结束处理
}

void CGameMain::OnMouseMove(const float fMouseX, const float fMouseY)
{
    // 可以添加鼠标移动的处理
}

void CGameMain::OnMouseClick(const int iMouseType, const float fMouseX, const float fMouseY)
{
    // 可以添加鼠标点击的处理
}

void CGameMain::OnMouseUp(const int iMouseType, const float fMouseX, const float fMouseY)
{
    // 可以添加鼠标释放的处理
}

void CGameMain::OnKeyDown(const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress)
{
    if (0 == GetGameState()) // 游戏未开始状态
    {
        if (iKey == KEY_K || iKey == KEY_SPACE) // 支持K键和空格键
        {
            SetGameState(1); // 设置为初始化状态
        }
    }
    else if (2 == GetGameState()) // 游戏进行中
    {
        if (m_pMan) {
            m_pMan->OnKeyDown(iKey);
        }
    }
    if (GetGameState() == 3 && iKey == KEY_R) {
        ResetGame();
        return;
    }
}

void CGameMain::OnKeyUp(const int iKey)
{
    if (2 == GetGameState())
    {
        if (m_pMan) {
            m_pMan->OnKeyUp(iKey);
        }
    }
}

// LessonX.cpp
void CGameMain::OnSpriteColSprite(const char* szSrcName, const char* szTarName)
{

    CWeapon* srcObj = FindObjectByName(szSrcName);
    CWeapon* tarObj = FindObjectByName(szTarName);

     if (!srcObj || !tarObj) {
        //printf("One of the objects is null\n");
        return;
    }

    // 处理玩家与dot的碰撞
    if (strstr(szSrcName, "man") && strstr(szTarName, "dot"))
    {
        printf("Man hit dot!\n"); // 调试输出
        CDot* pDot = dynamic_cast<CDot*>(tarObj);
        if (pDot)
        {
            printf("Dot is valid, adding score\n"); // 调试输出
            AddScore(1);
            pDot->SetSpriteVisible(false);
            pDot->SetSpriteCollisionActive(false, false);
            DeleteObjectByName(pDot->GetName());
        }
    }
    else if (strstr(szTarName, "man") && strstr(szSrcName, "dot"))
    {
        printf("Man hit dot (reverse)!\n"); // 调试输出
        CDot* pDot = dynamic_cast<CDot*>(srcObj);
        if (pDot)
        {
            printf("Dot is valid, adding score\n"); // 调试输出
            AddScore(1);
            pDot->SetSpriteVisible(false);
            pDot->SetSpriteCollisionActive(false, false);
            DeleteObjectByName(pDot->GetName());
        }
    }

    // 让源对象处理碰撞
    srcObj->OnSpriteColSprite(tarObj);

    // 让目标对象处理碰撞
    tarObj->OnSpriteColSprite(srcObj);
}

void CGameMain::OnSpriteColWorldLimit(const char* szName, const int iColSide)
{
    CWeapon* obj = FindObjectByName(szName);
    if (obj)
    {
        obj->OnSpriteColWorldLimit(iColSide);
    }
}

CWeapon* CGameMain::FindObjectByName(const char* szName)
{
    for (size_t i = 0; i < m_vGameObjects.size(); i++)
    {
        if (strcmp(szName, m_vGameObjects[i]->GetName()) == 0)
        {
            return m_vGameObjects[i];
        }
    }
    return nullptr;
}

void CGameMain::DeleteObjectByName(const char* szName)
{
    for (auto it = m_vGameObjects.begin(); it != m_vGameObjects.end(); ++it)
    {
        if (strcmp(szName, (*it)->GetName()) == 0)
        {
            (*it)->DeleteSprite();
            delete (*it);
            m_vGameObjects.erase(it);
            break;
        }
    }
}

void CGameMain::LoadGameObjects(bool bForceCreate)
{
    static bool bLoaded = false;
    if (!bForceCreate && bLoaded) return;

    // 清除旧对象
    if (bForceCreate) {
        for (auto it = m_vGameObjects.begin(); it != m_vGameObjects.end(); ) {
            if (*it != m_pMan) { // 保留玩家角色
                (*it)->DeleteSprite();
                delete *it;
                it = m_vGameObjects.erase(it);
            } else {
                ++it;
            }
        }
    }

    // 创建Di平台
    for (int i = 0; i < 25; i++)
    {
        char szName[32];
        sprintf(szName, "di%d", i);
        CDi* pDi = new CDi(szName);
        pDi->CloneSprite("di");
        pDi->Init();

        m_vGameObjects.push_back(pDi);
    }

     // 创建Dot收集物
    for (int i = 0; i < 20; i++) {
        char szName[32];
        sprintf(szName, "dot%d", i);
        CDot* pDot = new CDot(szName);
        pDot->CloneSprite("dot");
        pDot->Init();
        m_vGameObjects.push_back(pDot);
    }

    // 创建Door
    CDoor* pDoor = new CDoor("door");
    pDoor->CloneSprite("door");
    pDoor->Init();
    m_vGameObjects.push_back(pDoor);

    bLoaded = true;

    // 创建陷阱
    for (int i = 0; i < 33; i++) {
        char szName[32];
        sprintf(szName, "trap%d", i);
        CTrap* pTrap = new CTrap(szName);
        pTrap->CloneSprite("trap");
        pTrap->Init();
        m_vGameObjects.push_back(pTrap);
    }

    bLoaded = true;
}


// LessonX.cpp
void CGameMain::CheckAllCollisions()
{
    if (!m_pMan || m_pMan->IsDead()) return;

    for (auto obj : m_vGameObjects)
    {
        if (!obj || obj->IsDead() || obj == m_pMan) continue;

        // 确保Dot对象参与碰撞检测
        if (dynamic_cast<CDot*>(obj) && static_cast<CDot*>(obj)->IsDead()) {
            continue;
        }

        if (CheckAABBCollision(m_pMan, obj))
        {
            m_pMan->OnSpriteColSprite(obj);
            obj->OnSpriteColSprite(m_pMan);
        }
    }
}

bool CGameMain::CheckAABBCollision(CWeapon* obj1, CWeapon* obj2)
{
    if (!obj1 || !obj2) return false;

    // 获取obj1的碰撞框
    float left1 = obj1->GetSpritePositionX() - obj1->GetSpriteWidth()/2;
    float right1 = obj1->GetSpritePositionX() + obj1->GetSpriteWidth()/2;
    float top1 = obj1->GetSpritePositionY() + obj1->GetSpriteHeight()/2;
    float bottom1 = obj1->GetSpritePositionY() - obj1->GetSpriteHeight()/2;

    // 获取obj2的碰撞框
    float left2 = obj2->GetSpritePositionX() - obj2->GetSpriteWidth()/2;
    float right2 = obj2->GetSpritePositionX() + obj2->GetSpriteWidth()/2;
    float top2 = obj2->GetSpritePositionY() + obj2->GetSpriteHeight()/2;
    float bottom2 = obj2->GetSpritePositionY() - obj2->GetSpriteHeight()/2;

   // 精确的AABB碰撞检测
    bool collisionX = right1 > left2 && left1 < right2;
    bool collisionY = bottom1 > top2 && top1 < bottom2;

    return collisionX && collisionY;
}

CSprite* CGameMain::FindSpriteByName(const char* szName)
{
    // 首先在游戏对象列表中查找
    for (auto obj : m_vGameObjects) {
        if (strcmp(obj->GetName(), szName) == 0) {
            return obj;
        }
    }

    // 然后查找玩家角色
    if (m_pMan && strcmp(m_pMan->GetName(), szName) == 0) {
        return m_pMan;
    }

    // 然后查找开始界面
    if (m_pStart && strcmp(m_pStart->GetName(), szName) == 0) {
        return m_pStart;
    }

    // 查找结束精灵
    if (m_pEnd1 && strcmp(m_pEnd1->GetName(), szName) == 0) {
        return m_pEnd1;
    }

    if (m_pEnd2 && strcmp(m_pEnd2->GetName(), szName) == 0) {
        return m_pEnd2;
    }

    // 不再调用全局FindSprite
    return NULL;
}
void CGameMain::ShowEndSprites()
{
    if (m_pEnd1) {
        m_pEnd1->SetSpriteVisible(true);
    }
    if (m_pEnd2) {
        m_pEnd2->SetSpriteVisible(true);
    }
}
void CGameMain::ResetGame()
{


    m_iScore = 0;
    if (m_pScoreText) {
        m_pScoreText->SetTextValue(0); // 使用CTextSprite的SetTextValue方法
    }
    // 重置玩家状态
    if (m_pMan) {
        // 重置位置到起点
        m_pMan->SetSpritePosition(m_fStartX, m_fStartY);
        m_pMan->SetSpriteVisible(true);
        m_pMan->SetSpriteCollisionActive(true, true);
        // 重置速度
        m_pMan->SetCurrentSpeedX(0);
        m_pMan->SetCurrentSpeedY(0);
        // 重置跳跃状态
        m_pMan->SetCanJump(true);
        m_pMan->SetIsJumping(false);
    }

    // 重置初始化标志
    m_bInitialized = false;

    // 重新初始化游戏
    GameInit();

    // 设置游戏状态为进行中
    SetGameState(2);

    printf("Game reset complete\n");
}
